package schedule

import (
	"gin-epg/internal/app/client"
	"gin-epg/internal/app/service"
	"github.com/robfig/cron/v3"
	"log"
	"sync"
)

/**
 * Created by Goland
 * User: wkk alisleepy@hotmail.com
 * Time: 2023/1/8 - 02:02
 * Desc: <统一定时任务管理>
 */

// Conrs 定时器
var Conrs *cron.Cron

// 控制并发任务数量的通道
var taskQueue chan struct{}

// WaitGroup 用于等待所有任务完成
var wg sync.WaitGroup

// HandleCorn 定时任务入口
func init() {
	// 创建一个缓冲通道，限制并发任务数量为2
	taskQueue = make(chan struct{}, 2)

	//dump.P("开始处理定时任务")
	Conrs = cron.New() // 定时任务
	Conrs.Start()

	// 每4小时执行 Handle112114Cron 同步112114epg数据
	_, err11 := Conrs.AddFunc("@every 4h", func() {
		runTask(client.Handle112114Cron)
	}) // 每隔4小时执行一次Handle112114Cron方法
	if err11 != nil {
		log.Println("删除员工定时任务失败。。。")
		return
	}

	//  每4小时执行  handle51zmtCron 同步51zmtepg数据
	_, err12 := Conrs.AddFunc("@every 4h", func() {
		runTask(client.Handle51zmtCron)
		//log.Println("Run cron2 ...")
	}) // 每天凌晨1点执行一次Handle51zmtCron方法
	if err12 != nil {
		log.Println("处理51zmt定时任务失败。。。")
		return
	}

	// 每8小时执行 handleDenyCron 同步Denyepg数据
	_, err13 := Conrs.AddFunc("@every 8h", func() {
		runTask(client.HandleDenyCron)
	}) // 每天早上6点执行一次HandleDenyCron方法
	if err13 != nil {
		log.Println("处理Deny定时任务失败。。。")
		return
	}

	// 每8小时执行 HandleErwCron 同步erw.cc数据
	_, err14 := Conrs.AddFunc("@every 8h", func() {
		runTask(client.HandleErwCron)
	})
	if err14 != nil {
		log.Println("处理Erw定时任务失败。。。")
		return
	}

	// 每8小时执行 HandleZsdcCron 同步zsdc数据
	_, err15 := Conrs.AddFunc("@every 8h", func() {
		runTask(client.HandleZsdcCron)
	})
	if err15 != nil {
		log.Println("处理Zsdc定时任务失败。。。")
		return
	}

	// 每4小时执行 handleSc96655Cron
	_, err4 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleSc96655Cron(0, 2)
		})
	}) // 每4小时执行一次HandleSc96655Cron方法
	if err4 != nil {
		log.Println("处理Sc96655定时任务失败。。。")
		return
	}

	// 每4小时执行 handleBfgdCron
	_, err5 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleBfgdCron(0, 2)
		})
	}) // 每4小时执行一次HandleBfgdCron方法
	if err5 != nil {
		log.Println("处理Bfgd定时任务失败。。。")
		return
	}
	// 每4小时执行 handleSdyxCron
	_, err501 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleSdyxCron(0, 2)
		})
	}) // 每4小时执行一次handleSdyxCron方法
	if err501 != nil {
		log.Println("处理Sdyx定时任务失败。。。")
		return
	}

	// 每4小时执行 handleCntvCron
	_, err6 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleCntvCron(0, 2)
		})
	}) // 每4小时执行一次HandleCntvCron方法
	if err6 != nil {
		log.Println("处理Cntv定时任务失败。。。")
		return
	}

	// 每4小时执行 handleHntvCron
	_, err601 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleHntvCron(0, 2)
		})
	}) // 每4小时执行一次HandleHntvCron方法
	if err601 != nil {
		log.Println("处理Hntv定时任务失败。。。")
		return
	}

	// 每4小时执行 handleAdyCron
	_, err7 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleAdyCron(0, 2)
		})
	}) // 每4小时执行一次HandleAdyCron方法
	if err7 != nil {
		log.Println("处理Ady定时任务失败。。。")
		return
	}

	// 每4小时执行 handleKknCron
	_, err8 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleKknCron(0, 2)
		})
	}) // 每4小时执行一次HandleKknCron方法
	if err8 != nil {
		log.Println("处理Kkn定时任务失败。。。")
		return
	}

	// 每4小时执行 HandleSports8Cron
	_, err81 := Conrs.AddFunc("@every 4h", func() {
		runTask(client.HandleSports8Cron)
	}) // 每4小时执行一次HandleSports8Cron方法
	if err81 != nil {
		log.Println("处理Sports8定时任务失败。。。")
		return
	}

	// 每4小时执行 HandleWuyilivetvCron
	_, err811 := Conrs.AddFunc("@every 4h", func() {
		runTask(client.HandleWuyilivetvCron)
	}) // 每4小时执行一次HandleWuyilivetvCron方法
	if err811 != nil {
		log.Println("处理Wuyilivetv定时任务失败。。。")
		return
	}

	// 每4小时执行 HandleYstenFujianCron
	_, err31 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleYstenFujianCron(0, 2)
		})
	}) // 每4小时执行一次HandleYstenFujianCron方法
	if err31 != nil {
		log.Println("处理YstenFujian定时任务失败。。。")
		return
	}

	// 每1小时执行 HandleYstenHunanCron 湖南移动网络时解除注释 不在湖南移动网络时需要加上注释
	_, err32 := Conrs.AddFunc("@every 2h", func() {
		runTask(client.HandleYstenHunanCron)
	})
	if err32 != nil {
		log.Println("处理YstenHunan定时任务失败。。。")
		return
	}

	// 每4小时执行 HandleYstenJiangsuCron
	_, err33 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleYstenJiangsuCron(0, 2)
		})
	})
	if err33 != nil {
		log.Println("处理YstenJiangsu定时任务失败。。。")
		return
	}
	// 每2小时执行 HandleYstenLiaoningCron
	_, err34 := Conrs.AddFunc("@every 2h", func() {
		runTask(client.HandleYstenLiaoningCron)
	})
	if err34 != nil {
		log.Println("处理YstenLiaoning定时任务失败。。。")
		return
	}
	// 每4小时执行 HandleIfengCron
	_, err35 := Conrs.AddFunc("@every 4h", func() {
		runTask(func() error {
			return client.HandleIfengCron(0, 2)
		})
	}) // 每4小时执行一次HandleIfengCron方法
	if err35 != nil {
		log.Println("处理HandleIfengCron定时任务失败。。。")
		return
	}

	// 每4小时执行 HandleHunanTelecomCron 湖南电信网络时解除注释
	/*_, err41 := Conrs.AddFunc("@every 4h", func() {
		runTask(client.HandleHunanTelecomCron)
	})
	if err41 != nil {
		log.Println("处理HunanTelecom定时任务失败。。。")
		return
	}*/

	// 每4小时执行 HandleHunanTelecomMgtv 湖南电信网络时解除注释
	/*_, err42 := Conrs.AddFunc("@every 4h", func() {
		runTask(client.HandleHunanTelecomMgtvCron)
	})
	if err42 != nil {
		log.Println("处理HandleHunanTelecomMgtv定时任务失败。。。")
		return
	}*/

	// 每小时执行 handleTplCron
	_, err199 := Conrs.AddFunc("@every 1h", func() {
		runTask(func() error {
			return client.HandleTplCron(0, 2)
		})
	}) // 每小时执行一次HandleTplCron方法
	if err199 != nil {
		log.Println("处理Tpl定时任务失败。。。")
		return
	}

	// 每小时执行 handleEpgProgramSyncCron
	_, err200 := Conrs.AddFunc("@every 1h", func() {
		runTask(func() error {
			return service.HandleEpgProgramSyncCron(1, 2)
		}) // 将 HandleEpgProgramSyncCron 封装为符合 func() error 签名的匿名函数
	})
	if err200 != nil {
		log.Println("处理EpgProgramSync定时任务失败。。。")
		return
	}

	// 每2h同步一次epg xmltv 1天版本
	_, err201 := Conrs.AddFunc("@every 2h", func() {
		runTask(service.HandleEpgXmltv1dayGenCron)
	}) // 每天凌晨3点半执行一次HsandleEpgXmltvGenCron方法
	if err201 != nil {
		log.Println("处理EpgXmltvGen定时任务失败。。。")
		return
	}

	// 每天凌晨3点半执行 handleEpgXmltv7dayGenCron
	_, err202 := Conrs.AddFunc("30 3 * * *", func() {
		runTask(service.HandleEpgXmltv7dayGenCron)
	}) // 每天凌晨3点半执行一次HandleEpgXmltv7dayGenCron方法
	if err202 != nil {
		log.Println("处理EpgXmltv7dayGen定时任务失败。。。")
		return
	}

	// 每天凌晨3点40执行 handleEpgXmltv9dayGenCron
	_, err203 := Conrs.AddFunc("30 4 * * *", func() {
		runTask(service.HandleEpgXmltv9dayGenCron)
	}) // 每天凌晨3点半执行一次HandleEpgXmltv7dayGenCron方法
	if err203 != nil {
		log.Println("处理EpgXmltv9dayGen定时任务失败。。。")
		return
	}
	// 每天凌晨4点半执行 DeleteBefore7dayEpgProgram
	_, err204 := Conrs.AddFunc("30 5 * * *", func() {
		runTask(service.DeleteBefore7dayEpgProgram)
	}) // 每天凌晨4点半执行一次DeleteBefore7dayEpgProgram方法
	if err204 != nil {
		log.Println("处理DeleteBefore7dayEpgProgram定时任务失败。。。")
		return
	}
	// 每4小时同步xmltvepg到gitee
	_, err205 := Conrs.AddFunc("@every 4h", func() {
		runTask(client.SyncXmlGzToGitee)
	}) // 每4小时同步xmltvepg到gitee
	if err205 != nil {
		log.Println("处理SyncXmlGzToGitee定时任务失败。。。")
		return
	}
}

// runTask 用于控制并发任务数量
func runTask(task func() error) {
	// 将任务添加到队列中
	taskQueue <- struct{}{}
	wg.Add(1)

	go func() {
		defer wg.Done()
		defer func() {
			// 任务完成后释放队列空间
			<-taskQueue
		}()

		err := task()
		if err != nil {
			log.Printf("任务执行失败: %v\n", err)
		}
	}()
}

// 确保所有任务在程序退出前完成
func Wait() {
	wg.Wait()
}
